#include "led_controller.h"
#ifdef USE_POLSYS
#include "polsys.h"
#endif


// 定义一个任务，如果没有使用polsys可以不用定义，在别处定时调用LEDC_CtrlLoop任务入口函数即可
#ifdef USE_POLSYS
static pdata polsys_task_t mTask;
static bool mTaskIsRun = false;
#endif

static pdata int mLedNum = 0;
static pdata led_t *mLedList[MAX_LED];

static void LEDC_Run(led_t *obj);

// 任务入口：10ms循环执行
// 如果不使用 Polsys 需要定时调用
void LEDC_CtrlLoop()
{
    int i;
    for(i=0;i<mLedNum;i++)
    {
        LEDC_Run(mLedList[i]);
    }
}

// 注册(初始化)一个LED，让其受LEDC控制
void LEDC_Regist(led_t *led, led_on_func_t on, led_off_func_t off)
{
    led->Off = off;
    led->On = on;
    mLedList[mLedNum] = led;
    mLedNum++;

#ifdef USE_POLSYS
    if(mTaskIsRun == false)
    {
        Polsys_TaskInit(&mTask, LEDC_CtrlLoop, 10);
        mTaskIsRun = true;
    }
#endif
}

// 设置LED动作
void LEDC_SetAction(led_t *obj, led_action_t action, int action_value)
{
    obj->mAction = action;
    obj->mActionValue = action_value;
}


// 间隔10ms运行一次确保LED控制正常执行
static void LEDC_Run(led_t *obj)
{
    switch(obj->mAction)
    {
        case LED_ON:
        if(obj->mActionValue > 0)
        {
            obj->mActionValue--;
            obj->On();
        }
        else obj->mAction = LED_OFF;
        break;

        case LED_OFF:
        obj->Off();
        obj->mAction = LED_NULL;
        break;

        case LED_FLASH:
        if(obj->mTime<20)
            obj->Off();
        else if(obj->mTime<40)
            obj->On();
        else
        {
            obj->mTime = 0;
            obj->mActionValue--;
            if(obj->mActionValue == 0)
                obj->mAction = LED_OFF;
        }
        obj->mTime++;
        break;

        default :
        obj->mAction = LED_NULL;
        obj->mCount = 0;
        obj->mTime = 0;
        break;
    }
}
